package code12._class;

import org.junit.Test;

public class TestMethodClass {
	@Test
	public void f1() {
		MethodOuter mo = new MethodOuter();
		// 借助接口等其他类，在外部操作 局部内部类对象。
		MyInter mi = mo.getObj();
		System.out.println("age:"+mi.getAge());
		mi.print();
	}
	
}

class MethodOuter {// 外部类
	private int age = 20;
	public void show() {
		String sex = "男";// 局部变量
		class MethodInner {// 局部内部类
			String name = "tom";
			public void print() {
				System.out.println(name);// 自己
				System.out.println(age);// 外部
				// 可以使用 
				/*
在jdk1.8以前，在局部内部类中不能访问外部类的方法中非final修饰的变量
在jdk1.8及以后，外部类的方法中非final修饰的变量也可以被访问，其实是一种语法溏，本质上会自动将变量
变为final的
				 */
				System.out.println(sex);
				//sex = "女"; // 自动会添加上 final
				
			}
		}
		// 局部内部类只能在当前方法中使用
		MethodInner mi = new MethodInner();
		// 可以正常使用
		//System.out.println("mi.name:"+mi.name);
		//mi.print();
	}
	
	public MyInter getObj() {
		class MethodInner2 implements MyInter {
			public int age = 22;
			public void print(){
				System.out.println("MethodOuter.getObj().MethodInner2.print()");
			}
			@Override
			public int getAge() {
				return age;
			}
			@Override
			public void setAge(int age) {
				this.age = age;
			}
		}
		MethodInner2 mi2 = new MethodInner2();
		// 该方法返回局部内部类对象
		return mi2;
	}
}
interface MyInter {
	// 间接的访问属性
	int getAge();
	void setAge(int age);
	// 与对应方法声明相同
	void print();
}